I. Preliminaries

Loading libraries

library("tidyverse")
library("tibble")
library("msigdbr")
library("ggplot2")
library("TCGAbiolinks")
library("RNAseqQC")
library("DESeq2")
library("ensembldb")
library("purrr")
library("magrittr")
library("vsn")
library("matrixStats")
library("dplyr")
library("grex")

II. Downloading the TCGA gene expression data

Create a function for downloading TCGA gene expression data.

For more detailed documentation, refer to 2. Differential Gene Expression Analysis - TCGA.Rmd.

GDC_DIR = "../data/public/GDCdata"

query_and_filter_samples <- function(project) {
  query_tumor <- GDCquery(
    project = project,
    data.category = "Transcriptome Profiling",
    data.type = "Gene Expression Quantification",
    experimental.strategy = "RNA-Seq",
    workflow.type = "STAR - Counts",
    access = "open",
    sample.type = "Primary Tumor"
  )
  tumor <- getResults(query_tumor)

  query_normal <- GDCquery(
    project = project,
    data.category = "Transcriptome Profiling",
    data.type = "Gene Expression Quantification",
    experimental.strategy = "RNA-Seq",
    workflow.type = "STAR - Counts",
    access = "open",
    sample.type = "Solid Tissue Normal"
  )
  normal <- getResults(query_normal)

  submitter_ids <- inner_join(tumor, normal, by = "cases.submitter_id") %>%
    dplyr::select(cases.submitter_id)
  tumor <- tumor %>%
    dplyr::filter(cases.submitter_id %in% submitter_ids$cases.submitter_id)
  normal <- normal %>%
    dplyr::filter(cases.submitter_id %in% submitter_ids$cases.submitter_id)

  samples <- rbind(tumor, normal)
  unique(samples$sample_type)

  query_project <- GDCquery(
    project = project,
    data.category = "Transcriptome Profiling",
    data.type = "Gene Expression Quantification",
    experimental.strategy = "RNA-Seq",
    workflow.type = "STAR - Counts",
    access = "open",
    sample.type = c("Solid Tissue Normal", "Primary Tumor"),
    barcode = as.list(samples$sample.submitter_id)
  )
  
  # If this is your first time running this notebook (i.e., you have not yet downloaded the results of the query in the previous block),
  # uncomment the code block below

  # GDCdownload(
  #   query_coad,
  #   directory = GDC_DIR
  # )

  return(list(samples = samples, query_project = query_project))
}

Download the TCGA gene expression data for all the cancer types in TCGA.

Refer to this link for the list of TCGA cancer type abbreviations: https://gdc.cancer.gov/resources-tcga-users/tcga-code-tables/tcga-study-abbreviations

projects <- c(
  "TCGA-LAML", "TCGA-ACC", "TCGA-BLCA", "TCGA-LGG", "TCGA-BRCA",
  "TCGA-CESC", "TCGA-CHOL", "TCGA-COAD", "TCGA-ESCA",
  "TCGA-HNSC", "TCGA-KICH", "TCGA-KIRC",
  "TCGA-KIRP", "TCGA-LIHC", "TCGA-LUAD", "TCGA-LUSC", "TCGA-DLBC",
  "TCGA-MESO", "TCGA-OV", "TCGA-PAAD", "TCGA-PCPG", "TCGA-PRAD",
  "TCGA-READ", "TCGA-SARC", "TCGA-STAD", "TCGA-TGCT",
  "TCGA-THYM", "TCGA-THCA", "TCGA-UCS", "TCGA-UCEC", "TCGA-UVM"
)

with_results_projects <- c()

samples <- list()
project_data <- list()

for (project in projects) {
  result <- tryCatch(
    {
      result <- query_and_filter_samples(project)
      samples[[project]] <- result$samples
      project_data[[project]] <- result$query_project

      with_results_projects <- c(with_results_projects, project)
    },
    error = function(e) {

    }
  )
}

Running the code block above should generate and populate a directory named GDCdata.

III. Data preprocessing

Construct the RNA-seq count matrix for each cancer type.

tcga_data <- list()
tcga_matrix <- list()

projects <- with_results_projects
for (project in projects) {
  tcga_data[[project]] <- GDCprepare(
    project_data[[project]], 
    directory = GDC_DIR,
    summarizedExperiment = TRUE
  )
}
for (project in projects) {
  count_matrix <- assay(tcga_data[[project]], "unstranded")

  # Remove duplicate entries
  count_matrix_df <- data.frame(count_matrix)
  count_matrix_df <- count_matrix_df[!duplicated(count_matrix_df), ]
  count_matrix <- data.matrix(count_matrix_df)
  rownames(count_matrix) <- cleanid(rownames(count_matrix))
  count_matrix <- count_matrix[!(duplicated(rownames(count_matrix)) | duplicated(rownames(count_matrix), fromLast = TRUE)), ]

  tcga_matrix[[project]] <- count_matrix
}

Format the samples table so that it can be fed as input to DESeq2.

for (project in projects) {
  rownames(samples[[project]]) <- samples[[project]]$cases
  samples[[project]] <- samples[[project]] %>%
    dplyr::select(case = "cases.submitter_id", type = "sample_type")
  samples[[project]]$type <- str_replace(samples[[project]]$type, "Solid Tissue Normal", "normal")
  samples[[project]]$type <- str_replace(samples[[project]]$type, "Primary Tumor", "tumor")
}

DESeq2 requires the row names of samples should be identical to the column names of count_matrix.

for (project in projects) {
  colnames(tcga_matrix[[project]]) <- gsub(x = colnames(tcga_matrix[[project]]), pattern = "\\.", replacement = "-")
  tcga_matrix[[project]] <- tcga_matrix[[project]][, rownames(samples[[project]])]

  # Sanity check
  print(all(colnames(tcga_matrix[[project]]) == rownames(samples[[project]])))
}

IV. Differential gene expression analysis

References:

Construct the DESeqDataSet object for each cancer type.

dds_results <- list()

for (project in projects) {
  dds_results[[project]] <- DESeqDataSetFromMatrix(
    countData = tcga_matrix[[project]],
    colData = samples[[project]],
    design = ~type
  )
}
Warning: some variables in design formula are characters, converting to factorsWarning: some variables in design formula are characters, converting to factorsWarning: some variables in design formula are characters, converting to factorsWarning: some variables in design formula are characters, converting to factorsWarning: some variables in design formula are characters, converting to factorsWarning: some variables in design formula are characters, converting to factorsWarning: some variables in design formula are characters, converting to factorsWarning: some variables in design formula are characters, converting to factorsWarning: some variables in design formula are characters, converting to factorsWarning: some variables in design formula are characters, converting to factorsWarning: some variables in design formula are characters, converting to factorsWarning: some variables in design formula are characters, converting to factorsWarning: some variables in design formula are characters, converting to factorsWarning: some variables in design formula are characters, converting to factorsWarning: some variables in design formula are characters, converting to factorsWarning: some variables in design formula are characters, converting to factorsWarning: some variables in design formula are characters, converting to factorsWarning: some variables in design formula are characters, converting to factorsWarning: some variables in design formula are characters, converting to factorsWarning: some variables in design formula are characters, converting to factorsWarning: some variables in design formula are characters, converting to factorsWarning: some variables in design formula are characters, converting to factors

Regulated Cell Death

We obtain the gene sets from RCDdb: https://pmc.ncbi.nlm.nih.gov/articles/PMC11384979/

Afterwards, filter the gene sets in order to retain only the genes unique to the RCD type of interest.

This filtering step is already handled by the Snakemake workflow.

RCDdb <- "../data/public/rcd-gene-list/unique-genes/necroptosis-ferroptosis-pyroptosis/"

Write utility functions for filtering the gene sets, performing differential gene expression analysis, and plotting the results.

filter_gene_set_and_perform_dgea <- function(genes) {
  tcga_rcd <- list()

  for (project in projects) {
    rownames(genes) <- genes$gene_id
    tcga_rcd[[project]] <- tcga_matrix[[project]][rownames(tcga_matrix[[project]]) %in% genes$gene_id, ]
    tcga_rcd[[project]] <- tcga_rcd[[project]][, rownames(samples[[project]])]
  }

  dds_rcd <- list()
  res_rcd <- list()

  for (project in projects) {
    print(project)
    print("=============")
    dds <- DESeqDataSetFromMatrix(
      countData = tcga_rcd[[project]],
      colData = samples[[project]],
      design = ~type
    )
    dds <- filter_genes(dds, min_count = 10)
    dds$type <- relevel(dds$type, ref = "normal")
    dds_rcd[[project]] <- DESeq(dds)
    res_rcd[[project]] <- results(dds_rcd[[project]])
  }

  deseq.bbl.data <- list()

  for (project in projects) {
    deseq.results <- res_rcd[[project]]
    deseq.bbl.data[[project]] <- data.frame(
      row.names = rownames(deseq.results),
      baseMean = deseq.results$baseMean,
      log2FoldChange = deseq.results$log2FoldChange,
      lfcSE = deseq.results$lfcSE,
      stat = deseq.results$stat,
      pvalue = deseq.results$pvalue,
      padj = deseq.results$padj,
      cancer_type = project,
      gene_symbol = genes[rownames(deseq.results), "gene"]
    )
  }

  deseq.bbl.data.combined <- bind_rows(deseq.bbl.data)
  deseq.bbl.data.combined <- dplyr::filter(deseq.bbl.data.combined, abs(log2FoldChange) >= 1.5 & padj < 0.05)

  return(deseq.bbl.data.combined)
}
plot_dgea <- function(deseq.bbl.data.combined) {
  sizes <- c("<10^-15" = 4, "10^-10" = 3, "10^-5" = 2, "0.05" = 1)

  deseq.bbl.data.combined <- deseq.bbl.data.combined %>%
    mutate(fdr_category = cut(padj,
      breaks = c(-Inf, 1e-15, 1e-10, 1e-5, 0.05),
      labels = c("<10^-15", "10^-10", "10^-5", "0.05"),
      right = FALSE
    ))

  top_genes <- deseq.bbl.data.combined %>%
    group_by(cancer_type) %>%
    mutate(rank = rank(-abs(log2FoldChange))) %>%
    dplyr::filter(rank <= 10) %>%
    ungroup()

  ggplot(top_genes, aes(y = cancer_type, x = gene_symbol, size = fdr_category, fill = log2FoldChange)) +
    geom_point(alpha = 0.5, shape = 21, color = "black") +
    scale_size_manual(values = sizes) +
    scale_fill_gradient2(low = "blue", mid = "white", high = "red", limits = c(min(deseq.bbl.data.combined$log2FoldChange), max(deseq.bbl.data.combined$log2FoldChange))) +
    theme_minimal() +
    theme(
      axis.text.x = element_text(size = 9, angle = 90, hjust = 1)
    ) +
    theme(legend.position = "bottom") +
    theme(legend.position = "bottom") +
    labs(size = "Adjusted p-value", fill = "log2 FC", y = "Cancer type", x = "Gene")
}

1. Necroptosis

Fetch the gene set of interest.

genes <- read.csv(paste0(RCDdb, "Necroptosis.csv"))
print(genes)
genes$gene_id <- cleanid(genes$gene_id)
genes <- distinct(genes, gene_id, .keep_all = TRUE)
genes <- subset(genes, gene_id != "")
genes

Filter the genes to include only those in the gene set of interest, and then perform differential gene expression analysis.

deseq.bbl.data.combined <- filter_gene_set_and_perform_dgea(genes)
[1] "TCGA-BLCA"
[1] "============="
Warning: some variables in design formula are characters, converting to factorsestimating size factors
estimating dispersions
gene-wise dispersion estimates
mean-dispersion relationship
final dispersion estimates
fitting model and testing
[1] "TCGA-BRCA"
[1] "============="
Warning: some variables in design formula are characters, converting to factorsestimating size factors
estimating dispersions
gene-wise dispersion estimates
mean-dispersion relationship
final dispersion estimates
fitting model and testing
-- replacing outliers and refitting for 1 genes
-- DESeq argument 'minReplicatesForReplace' = 7 
-- original counts are preserved in counts(dds)
estimating dispersions
fitting model and testing
[1] "TCGA-CESC"
[1] "============="
Warning: some variables in design formula are characters, converting to factorsestimating size factors
estimating dispersions
gene-wise dispersion estimates
mean-dispersion relationship
-- note: fitType='parametric', but the dispersion trend was not well captured by the
   function: y = a/x + b, and a local regression fit was automatically substituted.
   specify fitType='local' or 'mean' to avoid this message next time.
final dispersion estimates
fitting model and testing
[1] "TCGA-CHOL"
[1] "============="
Warning: some variables in design formula are characters, converting to factorsestimating size factors
estimating dispersions
gene-wise dispersion estimates
mean-dispersion relationship
final dispersion estimates
fitting model and testing
-- replacing outliers and refitting for 1 genes
-- DESeq argument 'minReplicatesForReplace' = 7 
-- original counts are preserved in counts(dds)
estimating dispersions
fitting model and testing
[1] "TCGA-COAD"
[1] "============="
Warning: some variables in design formula are characters, converting to factorsestimating size factors
estimating dispersions
gene-wise dispersion estimates
mean-dispersion relationship
final dispersion estimates
fitting model and testing
-- replacing outliers and refitting for 1 genes
-- DESeq argument 'minReplicatesForReplace' = 7 
-- original counts are preserved in counts(dds)
estimating dispersions
fitting model and testing
[1] "TCGA-ESCA"
[1] "============="
Warning: some variables in design formula are characters, converting to factorsestimating size factors
estimating dispersions
gene-wise dispersion estimates
mean-dispersion relationship
final dispersion estimates
fitting model and testing
-- replacing outliers and refitting for 1 genes
-- DESeq argument 'minReplicatesForReplace' = 7 
-- original counts are preserved in counts(dds)
estimating dispersions
fitting model and testing
[1] "TCGA-HNSC"
[1] "============="
Warning: some variables in design formula are characters, converting to factorsestimating size factors
estimating dispersions
gene-wise dispersion estimates
mean-dispersion relationship
final dispersion estimates
fitting model and testing
-- replacing outliers and refitting for 1 genes
-- DESeq argument 'minReplicatesForReplace' = 7 
-- original counts are preserved in counts(dds)
estimating dispersions
fitting model and testing
[1] "TCGA-KICH"
[1] "============="
Warning: some variables in design formula are characters, converting to factorsestimating size factors
estimating dispersions
gene-wise dispersion estimates
mean-dispersion relationship
final dispersion estimates
fitting model and testing
[1] "TCGA-KIRC"
[1] "============="
Warning: some variables in design formula are characters, converting to factorsestimating size factors
estimating dispersions
gene-wise dispersion estimates
mean-dispersion relationship
final dispersion estimates
fitting model and testing
[1] "TCGA-KIRP"
[1] "============="
Warning: some variables in design formula are characters, converting to factorsestimating size factors
estimating dispersions
gene-wise dispersion estimates
mean-dispersion relationship
final dispersion estimates
fitting model and testing
-- replacing outliers and refitting for 1 genes
-- DESeq argument 'minReplicatesForReplace' = 7 
-- original counts are preserved in counts(dds)
estimating dispersions
fitting model and testing
[1] "TCGA-LIHC"
[1] "============="
Warning: some variables in design formula are characters, converting to factorsestimating size factors
estimating dispersions
gene-wise dispersion estimates
mean-dispersion relationship
final dispersion estimates
fitting model and testing
[1] "TCGA-LUAD"
[1] "============="
Warning: some variables in design formula are characters, converting to factorsestimating size factors
estimating dispersions
gene-wise dispersion estimates
mean-dispersion relationship
final dispersion estimates
fitting model and testing
[1] "TCGA-LUSC"
[1] "============="
Warning: some variables in design formula are characters, converting to factorsestimating size factors
estimating dispersions
gene-wise dispersion estimates
mean-dispersion relationship
final dispersion estimates
fitting model and testing
[1] "TCGA-PAAD"
[1] "============="
Warning: some variables in design formula are characters, converting to factorsestimating size factors
estimating dispersions
gene-wise dispersion estimates
mean-dispersion relationship
final dispersion estimates
fitting model and testing
[1] "TCGA-PCPG"
[1] "============="
Warning: some variables in design formula are characters, converting to factorsestimating size factors
estimating dispersions
gene-wise dispersion estimates
mean-dispersion relationship
-- note: fitType='parametric', but the dispersion trend was not well captured by the
   function: y = a/x + b, and a local regression fit was automatically substituted.
   specify fitType='local' or 'mean' to avoid this message next time.
final dispersion estimates
fitting model and testing
[1] "TCGA-PRAD"
[1] "============="
Warning: some variables in design formula are characters, converting to factorsestimating size factors
estimating dispersions
gene-wise dispersion estimates
mean-dispersion relationship
final dispersion estimates
fitting model and testing
-- replacing outliers and refitting for 1 genes
-- DESeq argument 'minReplicatesForReplace' = 7 
-- original counts are preserved in counts(dds)
estimating dispersions
fitting model and testing
[1] "TCGA-READ"
[1] "============="
Warning: some variables in design formula are characters, converting to factorsestimating size factors
estimating dispersions
gene-wise dispersion estimates
mean-dispersion relationship
final dispersion estimates
fitting model and testing
[1] "TCGA-SARC"
[1] "============="
Warning: some variables in design formula are characters, converting to factorsestimating size factors
estimating dispersions
gene-wise dispersion estimates
mean-dispersion relationship
final dispersion estimates
fitting model and testing
[1] "TCGA-STAD"
[1] "============="
Warning: some variables in design formula are characters, converting to factorsestimating size factors
estimating dispersions
gene-wise dispersion estimates
mean-dispersion relationship
final dispersion estimates
fitting model and testing
[1] "TCGA-THYM"
[1] "============="
Warning: some variables in design formula are characters, converting to factorsestimating size factors
estimating dispersions
gene-wise dispersion estimates
mean-dispersion relationship
final dispersion estimates
fitting model and testing
[1] "TCGA-THCA"
[1] "============="
Warning: some variables in design formula are characters, converting to factorsestimating size factors
estimating dispersions
gene-wise dispersion estimates
mean-dispersion relationship
final dispersion estimates
fitting model and testing
-- replacing outliers and refitting for 2 genes
-- DESeq argument 'minReplicatesForReplace' = 7 
-- original counts are preserved in counts(dds)
estimating dispersions
fitting model and testing
[1] "TCGA-UCEC"
[1] "============="
Warning: some variables in design formula are characters, converting to factorsestimating size factors
estimating dispersions
gene-wise dispersion estimates
mean-dispersion relationship
final dispersion estimates
fitting model and testing
-- replacing outliers and refitting for 1 genes
-- DESeq argument 'minReplicatesForReplace' = 7 
-- original counts are preserved in counts(dds)
estimating dispersions
fitting model and testing
deseq.bbl.data.combined

Plot the results.

plot_dgea(deseq.bbl.data.combined)

2. Ferroptosis

Fetch the gene set of interest.

genes <- read.csv(paste0(RCDdb, "Ferroptosis.csv"))
genes$gene_id <- cleanid(genes$gene_id)
genes <- distinct(genes, gene_id, .keep_all = TRUE)
genes <- subset(genes, gene_id != "")
genes

Filter the genes to include only those in the gene set of interest, and then perform differential gene expression analysis.

deseq.bbl.data.combined <- filter_gene_set_and_perform_dgea(genes)
[1] "TCGA-BLCA"
[1] "============="
Warning: some variables in design formula are characters, converting to factorsestimating size factors
estimating dispersions
gene-wise dispersion estimates
mean-dispersion relationship
final dispersion estimates
fitting model and testing
-- replacing outliers and refitting for 38 genes
-- DESeq argument 'minReplicatesForReplace' = 7 
-- original counts are preserved in counts(dds)
estimating dispersions
fitting model and testing
[1] "TCGA-BRCA"
[1] "============="
Warning: some variables in design formula are characters, converting to factorsestimating size factors
estimating dispersions
gene-wise dispersion estimates
mean-dispersion relationship
final dispersion estimates
fitting model and testing
-- replacing outliers and refitting for 39 genes
-- DESeq argument 'minReplicatesForReplace' = 7 
-- original counts are preserved in counts(dds)
estimating dispersions
fitting model and testing
[1] "TCGA-CESC"
[1] "============="
Warning: some variables in design formula are characters, converting to factorsestimating size factors
estimating dispersions
gene-wise dispersion estimates
mean-dispersion relationship
final dispersion estimates
fitting model and testing
[1] "TCGA-CHOL"
[1] "============="
Warning: some variables in design formula are characters, converting to factorsestimating size factors
estimating dispersions
gene-wise dispersion estimates
mean-dispersion relationship
final dispersion estimates
fitting model and testing
-- replacing outliers and refitting for 20 genes
-- DESeq argument 'minReplicatesForReplace' = 7 
-- original counts are preserved in counts(dds)
estimating dispersions
fitting model and testing
[1] "TCGA-COAD"
[1] "============="
Warning: some variables in design formula are characters, converting to factorsestimating size factors
estimating dispersions
gene-wise dispersion estimates
mean-dispersion relationship
final dispersion estimates
fitting model and testing
-- replacing outliers and refitting for 21 genes
-- DESeq argument 'minReplicatesForReplace' = 7 
-- original counts are preserved in counts(dds)
estimating dispersions
fitting model and testing
[1] "TCGA-ESCA"
[1] "============="
Warning: some variables in design formula are characters, converting to factorsestimating size factors
estimating dispersions
gene-wise dispersion estimates
mean-dispersion relationship
final dispersion estimates
fitting model and testing
-- replacing outliers and refitting for 34 genes
-- DESeq argument 'minReplicatesForReplace' = 7 
-- original counts are preserved in counts(dds)
estimating dispersions
fitting model and testing
[1] "TCGA-HNSC"
[1] "============="
Warning: some variables in design formula are characters, converting to factorsestimating size factors
estimating dispersions
gene-wise dispersion estimates
mean-dispersion relationship
final dispersion estimates
fitting model and testing
-- replacing outliers and refitting for 19 genes
-- DESeq argument 'minReplicatesForReplace' = 7 
-- original counts are preserved in counts(dds)
estimating dispersions
fitting model and testing
[1] "TCGA-KICH"
[1] "============="
Warning: some variables in design formula are characters, converting to factorsestimating size factors
estimating dispersions
gene-wise dispersion estimates
mean-dispersion relationship
final dispersion estimates
fitting model and testing
-- replacing outliers and refitting for 19 genes
-- DESeq argument 'minReplicatesForReplace' = 7 
-- original counts are preserved in counts(dds)
estimating dispersions
fitting model and testing
[1] "TCGA-KIRC"
[1] "============="
Warning: some variables in design formula are characters, converting to factorsestimating size factors
estimating dispersions
gene-wise dispersion estimates
mean-dispersion relationship
final dispersion estimates
fitting model and testing
-- replacing outliers and refitting for 25 genes
-- DESeq argument 'minReplicatesForReplace' = 7 
-- original counts are preserved in counts(dds)
estimating dispersions
fitting model and testing
[1] "TCGA-KIRP"
[1] "============="
Warning: some variables in design formula are characters, converting to factorsestimating size factors
estimating dispersions
gene-wise dispersion estimates
mean-dispersion relationship
final dispersion estimates
fitting model and testing
-- replacing outliers and refitting for 19 genes
-- DESeq argument 'minReplicatesForReplace' = 7 
-- original counts are preserved in counts(dds)
estimating dispersions
fitting model and testing
[1] "TCGA-LIHC"
[1] "============="
Warning: some variables in design formula are characters, converting to factorsestimating size factors
estimating dispersions
gene-wise dispersion estimates
mean-dispersion relationship
final dispersion estimates
fitting model and testing
-- replacing outliers and refitting for 35 genes
-- DESeq argument 'minReplicatesForReplace' = 7 
-- original counts are preserved in counts(dds)
estimating dispersions
fitting model and testing
[1] "TCGA-LUAD"
[1] "============="
Warning: some variables in design formula are characters, converting to factorsestimating size factors
estimating dispersions
gene-wise dispersion estimates
mean-dispersion relationship
final dispersion estimates
fitting model and testing
-- replacing outliers and refitting for 21 genes
-- DESeq argument 'minReplicatesForReplace' = 7 
-- original counts are preserved in counts(dds)
estimating dispersions
fitting model and testing
[1] "TCGA-LUSC"
[1] "============="
Warning: some variables in design formula are characters, converting to factorsestimating size factors
estimating dispersions
gene-wise dispersion estimates
mean-dispersion relationship
final dispersion estimates
fitting model and testing
-- replacing outliers and refitting for 17 genes
-- DESeq argument 'minReplicatesForReplace' = 7 
-- original counts are preserved in counts(dds)
estimating dispersions
fitting model and testing
[1] "TCGA-PAAD"
[1] "============="
Warning: some variables in design formula are characters, converting to factorsestimating size factors
estimating dispersions
gene-wise dispersion estimates
mean-dispersion relationship
final dispersion estimates
fitting model and testing
[1] "TCGA-PCPG"
[1] "============="
Warning: some variables in design formula are characters, converting to factorsestimating size factors
estimating dispersions
gene-wise dispersion estimates
mean-dispersion relationship
final dispersion estimates
fitting model and testing
[1] "TCGA-PRAD"
[1] "============="
Warning: some variables in design formula are characters, converting to factorsestimating size factors
estimating dispersions
gene-wise dispersion estimates
mean-dispersion relationship
final dispersion estimates
fitting model and testing
-- replacing outliers and refitting for 22 genes
-- DESeq argument 'minReplicatesForReplace' = 7 
-- original counts are preserved in counts(dds)
estimating dispersions
fitting model and testing
[1] "TCGA-READ"
[1] "============="
Warning: some variables in design formula are characters, converting to factorsestimating size factors
estimating dispersions
gene-wise dispersion estimates
mean-dispersion relationship
final dispersion estimates
fitting model and testing
-- replacing outliers and refitting for 8 genes
-- DESeq argument 'minReplicatesForReplace' = 7 
-- original counts are preserved in counts(dds)
estimating dispersions
fitting model and testing
[1] "TCGA-SARC"
[1] "============="
Warning: some variables in design formula are characters, converting to factorsestimating size factors
estimating dispersions
gene-wise dispersion estimates
mean-dispersion relationship
final dispersion estimates
fitting model and testing
[1] "TCGA-STAD"
[1] "============="
Warning: some variables in design formula are characters, converting to factorsestimating size factors
estimating dispersions
gene-wise dispersion estimates
mean-dispersion relationship
final dispersion estimates
fitting model and testing
-- replacing outliers and refitting for 17 genes
-- DESeq argument 'minReplicatesForReplace' = 7 
-- original counts are preserved in counts(dds)
estimating dispersions
fitting model and testing
[1] "TCGA-THYM"
[1] "============="
Warning: some variables in design formula are characters, converting to factorsestimating size factors
estimating dispersions
gene-wise dispersion estimates
mean-dispersion relationship
final dispersion estimates
fitting model and testing
[1] "TCGA-THCA"
[1] "============="
Warning: some variables in design formula are characters, converting to factorsestimating size factors
estimating dispersions
gene-wise dispersion estimates
mean-dispersion relationship
final dispersion estimates
fitting model and testing
-- replacing outliers and refitting for 10 genes
-- DESeq argument 'minReplicatesForReplace' = 7 
-- original counts are preserved in counts(dds)
estimating dispersions
fitting model and testing
[1] "TCGA-UCEC"
[1] "============="
Warning: some variables in design formula are characters, converting to factorsestimating size factors
estimating dispersions
gene-wise dispersion estimates
mean-dispersion relationship
final dispersion estimates
fitting model and testing
-- replacing outliers and refitting for 22 genes
-- DESeq argument 'minReplicatesForReplace' = 7 
-- original counts are preserved in counts(dds)
estimating dispersions
fitting model and testing
deseq.bbl.data.combined

Plot the results.

plot_dgea(deseq.bbl.data.combined)

3. Pyroptosis

Fetch the gene set of interest.

genes <- read.csv(paste0(RCDdb, "Pyroptosis.csv"))
genes$gene_id <- cleanid(genes$gene_id)
genes <- distinct(genes, gene_id, .keep_all = TRUE)
genes <- subset(genes, gene_id != "")
genes

Filter the genes to include only those in the gene set of interest, and then perform differential gene expression analysis.

deseq.bbl.data.combined <- filter_gene_set_and_perform_dgea(genes)
[1] "TCGA-BLCA"
[1] "============="
Warning: some variables in design formula are characters, converting to factorsestimating size factors
estimating dispersions
gene-wise dispersion estimates
mean-dispersion relationship
final dispersion estimates
fitting model and testing
-- replacing outliers and refitting for 4 genes
-- DESeq argument 'minReplicatesForReplace' = 7 
-- original counts are preserved in counts(dds)
estimating dispersions
fitting model and testing
[1] "TCGA-BRCA"
[1] "============="
Warning: some variables in design formula are characters, converting to factorsestimating size factors
estimating dispersions
gene-wise dispersion estimates
mean-dispersion relationship
final dispersion estimates
fitting model and testing
[1] "TCGA-CESC"
[1] "============="
Warning: some variables in design formula are characters, converting to factorsestimating size factors
estimating dispersions
gene-wise dispersion estimates
mean-dispersion relationship
final dispersion estimates
fitting model and testing
[1] "TCGA-CHOL"
[1] "============="
Warning: some variables in design formula are characters, converting to factorsestimating size factors
estimating dispersions
gene-wise dispersion estimates
mean-dispersion relationship
final dispersion estimates
fitting model and testing
-- replacing outliers and refitting for 2 genes
-- DESeq argument 'minReplicatesForReplace' = 7 
-- original counts are preserved in counts(dds)
estimating dispersions
fitting model and testing
[1] "TCGA-COAD"
[1] "============="
Warning: some variables in design formula are characters, converting to factorsestimating size factors
estimating dispersions
gene-wise dispersion estimates
mean-dispersion relationship
final dispersion estimates
fitting model and testing
-- replacing outliers and refitting for 3 genes
-- DESeq argument 'minReplicatesForReplace' = 7 
-- original counts are preserved in counts(dds)
estimating dispersions
fitting model and testing
[1] "TCGA-ESCA"
[1] "============="
Warning: some variables in design formula are characters, converting to factorsestimating size factors
estimating dispersions
gene-wise dispersion estimates
mean-dispersion relationship
final dispersion estimates
fitting model and testing
-- replacing outliers and refitting for 4 genes
-- DESeq argument 'minReplicatesForReplace' = 7 
-- original counts are preserved in counts(dds)
estimating dispersions
fitting model and testing
[1] "TCGA-HNSC"
[1] "============="
Warning: some variables in design formula are characters, converting to factorsestimating size factors
estimating dispersions
gene-wise dispersion estimates
mean-dispersion relationship
final dispersion estimates
fitting model and testing
[1] "TCGA-KICH"
[1] "============="
Warning: some variables in design formula are characters, converting to factorsestimating size factors
estimating dispersions
gene-wise dispersion estimates
mean-dispersion relationship
final dispersion estimates
fitting model and testing
-- replacing outliers and refitting for 3 genes
-- DESeq argument 'minReplicatesForReplace' = 7 
-- original counts are preserved in counts(dds)
estimating dispersions
fitting model and testing
[1] "TCGA-KIRC"
[1] "============="
Warning: some variables in design formula are characters, converting to factorsestimating size factors
estimating dispersions
gene-wise dispersion estimates
mean-dispersion relationship
final dispersion estimates
fitting model and testing
-- replacing outliers and refitting for 1 genes
-- DESeq argument 'minReplicatesForReplace' = 7 
-- original counts are preserved in counts(dds)
estimating dispersions
fitting model and testing
[1] "TCGA-KIRP"
[1] "============="
Warning: some variables in design formula are characters, converting to factorsestimating size factors
estimating dispersions
gene-wise dispersion estimates
mean-dispersion relationship
final dispersion estimates
fitting model and testing
[1] "TCGA-LIHC"
[1] "============="
Warning: some variables in design formula are characters, converting to factorsestimating size factors
estimating dispersions
gene-wise dispersion estimates
mean-dispersion relationship
final dispersion estimates
fitting model and testing
-- replacing outliers and refitting for 3 genes
-- DESeq argument 'minReplicatesForReplace' = 7 
-- original counts are preserved in counts(dds)
estimating dispersions
fitting model and testing
[1] "TCGA-LUAD"
[1] "============="
Warning: some variables in design formula are characters, converting to factorsestimating size factors
estimating dispersions
gene-wise dispersion estimates
mean-dispersion relationship
final dispersion estimates
fitting model and testing
-- replacing outliers and refitting for 1 genes
-- DESeq argument 'minReplicatesForReplace' = 7 
-- original counts are preserved in counts(dds)
estimating dispersions
fitting model and testing
[1] "TCGA-LUSC"
[1] "============="
Warning: some variables in design formula are characters, converting to factorsestimating size factors
estimating dispersions
gene-wise dispersion estimates
mean-dispersion relationship
final dispersion estimates
fitting model and testing
-- replacing outliers and refitting for 2 genes
-- DESeq argument 'minReplicatesForReplace' = 7 
-- original counts are preserved in counts(dds)
estimating dispersions
fitting model and testing
[1] "TCGA-PAAD"
[1] "============="
Warning: some variables in design formula are characters, converting to factorsestimating size factors
estimating dispersions
gene-wise dispersion estimates
mean-dispersion relationship
final dispersion estimates
fitting model and testing
[1] "TCGA-PCPG"
[1] "============="
Warning: some variables in design formula are characters, converting to factorsestimating size factors
estimating dispersions
gene-wise dispersion estimates
mean-dispersion relationship
final dispersion estimates
fitting model and testing
[1] "TCGA-PRAD"
[1] "============="
Warning: some variables in design formula are characters, converting to factorsestimating size factors
estimating dispersions
gene-wise dispersion estimates
mean-dispersion relationship
final dispersion estimates
fitting model and testing
[1] "TCGA-READ"
[1] "============="
Warning: some variables in design formula are characters, converting to factorsestimating size factors
estimating dispersions
gene-wise dispersion estimates
mean-dispersion relationship
final dispersion estimates
fitting model and testing
-- replacing outliers and refitting for 1 genes
-- DESeq argument 'minReplicatesForReplace' = 7 
-- original counts are preserved in counts(dds)
estimating dispersions
fitting model and testing
[1] "TCGA-SARC"
[1] "============="
Warning: some variables in design formula are characters, converting to factorsestimating size factors
estimating dispersions
gene-wise dispersion estimates
mean-dispersion relationship
-- note: fitType='parametric', but the dispersion trend was not well captured by the
   function: y = a/x + b, and a local regression fit was automatically substituted.
   specify fitType='local' or 'mean' to avoid this message next time.
final dispersion estimates
fitting model and testing
[1] "TCGA-STAD"
[1] "============="
Warning: some variables in design formula are characters, converting to factorsestimating size factors
estimating dispersions
gene-wise dispersion estimates
mean-dispersion relationship
final dispersion estimates
fitting model and testing
-- replacing outliers and refitting for 2 genes
-- DESeq argument 'minReplicatesForReplace' = 7 
-- original counts are preserved in counts(dds)
estimating dispersions
fitting model and testing
[1] "TCGA-THYM"
[1] "============="
Warning: some variables in design formula are characters, converting to factorsestimating size factors
estimating dispersions
gene-wise dispersion estimates
mean-dispersion relationship
final dispersion estimates
fitting model and testing
[1] "TCGA-THCA"
[1] "============="
Warning: some variables in design formula are characters, converting to factorsestimating size factors
estimating dispersions
gene-wise dispersion estimates
mean-dispersion relationship
final dispersion estimates
fitting model and testing
-- replacing outliers and refitting for 3 genes
-- DESeq argument 'minReplicatesForReplace' = 7 
-- original counts are preserved in counts(dds)
estimating dispersions
fitting model and testing
[1] "TCGA-UCEC"
[1] "============="
Warning: some variables in design formula are characters, converting to factorsestimating size factors
estimating dispersions
gene-wise dispersion estimates
mean-dispersion relationship
final dispersion estimates
fitting model and testing
-- replacing outliers and refitting for 4 genes
-- DESeq argument 'minReplicatesForReplace' = 7 
-- original counts are preserved in counts(dds)
estimating dispersions
fitting model and testing
deseq.bbl.data.combined

Plot the results.

plot_dgea(deseq.bbl.data.combined)


  1. De La Salle University, Manila, Philippines, ↩︎

  2. De La Salle University, Manila, Philippines, ↩︎

LS0tDQp0aXRsZTogIkRpZmZlcmVudGlhbCBHZW5lIEV4cHJlc3Npb24gQW5hbHlzaXMiDQpzdWJ0aXRsZTogIlBhbi1jYW5jZXIgfCBOZWNyb3B0b3NpcywgRmVycm9wdG9zaXMgJiBQeXJvcHRvc2lzIHwgVW5pcXVlIEdlbmVzIHBlciBSQ0QgVHlwZSINCmF1dGhvcjogDQogIC0gTWFyayBFZHdhcmQgTS4gR29uemFsZXNeW0RlIExhIFNhbGxlIFVuaXZlcnNpdHksIE1hbmlsYSwgUGhpbGlwcGluZXMsIGdvbnphbGVzLm1hcmtlZHdhcmRAZ21haWwuY29tXQ0KICAtIERyLiBBbmlzaCBNLlMuIFNocmVzdGhhXltEZSBMYSBTYWxsZSBVbml2ZXJzaXR5LCBNYW5pbGEsIFBoaWxpcHBpbmVzLCBhbmlzaC5zaHJlc3RoYUBkbHN1LmVkdS5waF0NCm91dHB1dDogaHRtbF9ub3RlYm9vaw0KLS0tDQoNCiMjIEkuIFByZWxpbWluYXJpZXMNCg0KIyMjIExvYWRpbmcgbGlicmFyaWVzDQoNCmBgYHtyLCB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFfQ0KbGlicmFyeSgidGlkeXZlcnNlIikNCmxpYnJhcnkoInRpYmJsZSIpDQpsaWJyYXJ5KCJtc2lnZGJyIikNCmxpYnJhcnkoImdncGxvdDIiKQ0KbGlicmFyeSgiVENHQWJpb2xpbmtzIikNCmxpYnJhcnkoIlJOQXNlcVFDIikNCmxpYnJhcnkoIkRFU2VxMiIpDQpsaWJyYXJ5KCJlbnNlbWJsZGIiKQ0KbGlicmFyeSgicHVycnIiKQ0KbGlicmFyeSgibWFncml0dHIiKQ0KbGlicmFyeSgidnNuIikNCmxpYnJhcnkoIm1hdHJpeFN0YXRzIikNCmxpYnJhcnkoImRwbHlyIikNCmxpYnJhcnkoImdyZXgiKQ0KYGBgDQoNCiMjIElJLiBEb3dubG9hZGluZyB0aGUgVENHQSBnZW5lIGV4cHJlc3Npb24gZGF0YSANCg0KQ3JlYXRlIGEgZnVuY3Rpb24gZm9yIGRvd25sb2FkaW5nIFRDR0EgZ2VuZSBleHByZXNzaW9uIGRhdGEuIA0KDQpGb3IgbW9yZSBkZXRhaWxlZCBkb2N1bWVudGF0aW9uLCByZWZlciB0byBgMi4gRGlmZmVyZW50aWFsIEdlbmUgRXhwcmVzc2lvbiBBbmFseXNpcyAtIFRDR0EuUm1kYC4NCg0KYGBge3J9DQpHRENfRElSID0gIi4uL2RhdGEvcHVibGljL0dEQ2RhdGEiDQoNCnF1ZXJ5X2FuZF9maWx0ZXJfc2FtcGxlcyA8LSBmdW5jdGlvbihwcm9qZWN0KSB7DQogIHF1ZXJ5X3R1bW9yIDwtIEdEQ3F1ZXJ5KA0KICAgIHByb2plY3QgPSBwcm9qZWN0LA0KICAgIGRhdGEuY2F0ZWdvcnkgPSAiVHJhbnNjcmlwdG9tZSBQcm9maWxpbmciLA0KICAgIGRhdGEudHlwZSA9ICJHZW5lIEV4cHJlc3Npb24gUXVhbnRpZmljYXRpb24iLA0KICAgIGV4cGVyaW1lbnRhbC5zdHJhdGVneSA9ICJSTkEtU2VxIiwNCiAgICB3b3JrZmxvdy50eXBlID0gIlNUQVIgLSBDb3VudHMiLA0KICAgIGFjY2VzcyA9ICJvcGVuIiwNCiAgICBzYW1wbGUudHlwZSA9ICJQcmltYXJ5IFR1bW9yIg0KICApDQogIHR1bW9yIDwtIGdldFJlc3VsdHMocXVlcnlfdHVtb3IpDQoNCiAgcXVlcnlfbm9ybWFsIDwtIEdEQ3F1ZXJ5KA0KICAgIHByb2plY3QgPSBwcm9qZWN0LA0KICAgIGRhdGEuY2F0ZWdvcnkgPSAiVHJhbnNjcmlwdG9tZSBQcm9maWxpbmciLA0KICAgIGRhdGEudHlwZSA9ICJHZW5lIEV4cHJlc3Npb24gUXVhbnRpZmljYXRpb24iLA0KICAgIGV4cGVyaW1lbnRhbC5zdHJhdGVneSA9ICJSTkEtU2VxIiwNCiAgICB3b3JrZmxvdy50eXBlID0gIlNUQVIgLSBDb3VudHMiLA0KICAgIGFjY2VzcyA9ICJvcGVuIiwNCiAgICBzYW1wbGUudHlwZSA9ICJTb2xpZCBUaXNzdWUgTm9ybWFsIg0KICApDQogIG5vcm1hbCA8LSBnZXRSZXN1bHRzKHF1ZXJ5X25vcm1hbCkNCg0KICBzdWJtaXR0ZXJfaWRzIDwtIGlubmVyX2pvaW4odHVtb3IsIG5vcm1hbCwgYnkgPSAiY2FzZXMuc3VibWl0dGVyX2lkIikgJT4lDQogICAgZHBseXI6OnNlbGVjdChjYXNlcy5zdWJtaXR0ZXJfaWQpDQogIHR1bW9yIDwtIHR1bW9yICU+JQ0KICAgIGRwbHlyOjpmaWx0ZXIoY2FzZXMuc3VibWl0dGVyX2lkICVpbiUgc3VibWl0dGVyX2lkcyRjYXNlcy5zdWJtaXR0ZXJfaWQpDQogIG5vcm1hbCA8LSBub3JtYWwgJT4lDQogICAgZHBseXI6OmZpbHRlcihjYXNlcy5zdWJtaXR0ZXJfaWQgJWluJSBzdWJtaXR0ZXJfaWRzJGNhc2VzLnN1Ym1pdHRlcl9pZCkNCg0KICBzYW1wbGVzIDwtIHJiaW5kKHR1bW9yLCBub3JtYWwpDQogIHVuaXF1ZShzYW1wbGVzJHNhbXBsZV90eXBlKQ0KDQogIHF1ZXJ5X3Byb2plY3QgPC0gR0RDcXVlcnkoDQogICAgcHJvamVjdCA9IHByb2plY3QsDQogICAgZGF0YS5jYXRlZ29yeSA9ICJUcmFuc2NyaXB0b21lIFByb2ZpbGluZyIsDQogICAgZGF0YS50eXBlID0gIkdlbmUgRXhwcmVzc2lvbiBRdWFudGlmaWNhdGlvbiIsDQogICAgZXhwZXJpbWVudGFsLnN0cmF0ZWd5ID0gIlJOQS1TZXEiLA0KICAgIHdvcmtmbG93LnR5cGUgPSAiU1RBUiAtIENvdW50cyIsDQogICAgYWNjZXNzID0gIm9wZW4iLA0KICAgIHNhbXBsZS50eXBlID0gYygiU29saWQgVGlzc3VlIE5vcm1hbCIsICJQcmltYXJ5IFR1bW9yIiksDQogICAgYmFyY29kZSA9IGFzLmxpc3Qoc2FtcGxlcyRzYW1wbGUuc3VibWl0dGVyX2lkKQ0KICApDQogIA0KICAjIElmIHRoaXMgaXMgeW91ciBmaXJzdCB0aW1lIHJ1bm5pbmcgdGhpcyBub3RlYm9vayAoaS5lLiwgeW91IGhhdmUgbm90IHlldCBkb3dubG9hZGVkIHRoZSByZXN1bHRzIG9mIHRoZSBxdWVyeSBpbiB0aGUgcHJldmlvdXMgYmxvY2spLA0KICAjIHVuY29tbWVudCB0aGUgY29kZSBibG9jayBiZWxvdw0KDQogICMgR0RDZG93bmxvYWQoDQogICMgICBxdWVyeV9jb2FkLA0KICAjICAgZGlyZWN0b3J5ID0gR0RDX0RJUg0KICAjICkNCg0KICByZXR1cm4obGlzdChzYW1wbGVzID0gc2FtcGxlcywgcXVlcnlfcHJvamVjdCA9IHF1ZXJ5X3Byb2plY3QpKQ0KfQ0KYGBgDQoNCkRvd25sb2FkIHRoZSBUQ0dBIGdlbmUgZXhwcmVzc2lvbiBkYXRhIGZvciBhbGwgdGhlIGNhbmNlciB0eXBlcyBpbiBUQ0dBLg0KDQpSZWZlciB0byB0aGlzIGxpbmsgZm9yIHRoZSBsaXN0IG9mIFRDR0EgY2FuY2VyIHR5cGUgYWJicmV2aWF0aW9uczogaHR0cHM6Ly9nZGMuY2FuY2VyLmdvdi9yZXNvdXJjZXMtdGNnYS11c2Vycy90Y2dhLWNvZGUtdGFibGVzL3RjZ2Etc3R1ZHktYWJicmV2aWF0aW9ucw0KDQpgYGB7ciwgZWNobyA9IFRSVUUsIG1lc3NhZ2UgPSBGQUxTRSwgcmVzdWx0cz0iaGlkZSJ9DQpwcm9qZWN0cyA8LSBjKA0KICAiVENHQS1MQU1MIiwgIlRDR0EtQUNDIiwgIlRDR0EtQkxDQSIsICJUQ0dBLUxHRyIsICJUQ0dBLUJSQ0EiLA0KICAiVENHQS1DRVNDIiwgIlRDR0EtQ0hPTCIsICJUQ0dBLUNPQUQiLCAiVENHQS1FU0NBIiwNCiAgIlRDR0EtSE5TQyIsICJUQ0dBLUtJQ0giLCAiVENHQS1LSVJDIiwNCiAgIlRDR0EtS0lSUCIsICJUQ0dBLUxJSEMiLCAiVENHQS1MVUFEIiwgIlRDR0EtTFVTQyIsICJUQ0dBLURMQkMiLA0KICAiVENHQS1NRVNPIiwgIlRDR0EtT1YiLCAiVENHQS1QQUFEIiwgIlRDR0EtUENQRyIsICJUQ0dBLVBSQUQiLA0KICAiVENHQS1SRUFEIiwgIlRDR0EtU0FSQyIsICJUQ0dBLVNUQUQiLCAiVENHQS1UR0NUIiwNCiAgIlRDR0EtVEhZTSIsICJUQ0dBLVRIQ0EiLCAiVENHQS1VQ1MiLCAiVENHQS1VQ0VDIiwgIlRDR0EtVVZNIg0KKQ0KDQp3aXRoX3Jlc3VsdHNfcHJvamVjdHMgPC0gYygpDQoNCnNhbXBsZXMgPC0gbGlzdCgpDQpwcm9qZWN0X2RhdGEgPC0gbGlzdCgpDQoNCmZvciAocHJvamVjdCBpbiBwcm9qZWN0cykgew0KICByZXN1bHQgPC0gdHJ5Q2F0Y2goDQogICAgew0KICAgICAgcmVzdWx0IDwtIHF1ZXJ5X2FuZF9maWx0ZXJfc2FtcGxlcyhwcm9qZWN0KQ0KICAgICAgc2FtcGxlc1tbcHJvamVjdF1dIDwtIHJlc3VsdCRzYW1wbGVzDQogICAgICBwcm9qZWN0X2RhdGFbW3Byb2plY3RdXSA8LSByZXN1bHQkcXVlcnlfcHJvamVjdA0KDQogICAgICB3aXRoX3Jlc3VsdHNfcHJvamVjdHMgPC0gYyh3aXRoX3Jlc3VsdHNfcHJvamVjdHMsIHByb2plY3QpDQogICAgfSwNCiAgICBlcnJvciA9IGZ1bmN0aW9uKGUpIHsNCg0KICAgIH0NCiAgKQ0KfQ0KYGBgDQoNCg0KUnVubmluZyB0aGUgY29kZSBibG9jayBhYm92ZSBzaG91bGQgZ2VuZXJhdGUgYW5kIHBvcHVsYXRlIGEgZGlyZWN0b3J5IG5hbWVkIGBHRENkYXRhYC4NCg0KIyMgSUlJLiBEYXRhIHByZXByb2Nlc3NpbmcNCg0KQ29uc3RydWN0IHRoZSBSTkEtc2VxIGNvdW50IG1hdHJpeCBmb3IgZWFjaCBjYW5jZXIgdHlwZS4NCg0KYGBge3IsIGVjaG8gPSBUUlVFLCBtZXNzYWdlID0gRkFMU0UsIHJlc3VsdHM9ImhpZGUifQ0KdGNnYV9kYXRhIDwtIGxpc3QoKQ0KdGNnYV9tYXRyaXggPC0gbGlzdCgpDQoNCnByb2plY3RzIDwtIHdpdGhfcmVzdWx0c19wcm9qZWN0cw0KZm9yIChwcm9qZWN0IGluIHByb2plY3RzKSB7DQogIHRjZ2FfZGF0YVtbcHJvamVjdF1dIDwtIEdEQ3ByZXBhcmUoDQogICAgcHJvamVjdF9kYXRhW1twcm9qZWN0XV0sIA0KICAgIGRpcmVjdG9yeSA9IEdEQ19ESVIsDQogICAgc3VtbWFyaXplZEV4cGVyaW1lbnQgPSBUUlVFDQogICkNCn0NCmBgYA0KDQpgYGB7cn0NCmZvciAocHJvamVjdCBpbiBwcm9qZWN0cykgew0KICBjb3VudF9tYXRyaXggPC0gYXNzYXkodGNnYV9kYXRhW1twcm9qZWN0XV0sICJ1bnN0cmFuZGVkIikNCg0KICAjIFJlbW92ZSBkdXBsaWNhdGUgZW50cmllcw0KICBjb3VudF9tYXRyaXhfZGYgPC0gZGF0YS5mcmFtZShjb3VudF9tYXRyaXgpDQogIGNvdW50X21hdHJpeF9kZiA8LSBjb3VudF9tYXRyaXhfZGZbIWR1cGxpY2F0ZWQoY291bnRfbWF0cml4X2RmKSwgXQ0KICBjb3VudF9tYXRyaXggPC0gZGF0YS5tYXRyaXgoY291bnRfbWF0cml4X2RmKQ0KICByb3duYW1lcyhjb3VudF9tYXRyaXgpIDwtIGNsZWFuaWQocm93bmFtZXMoY291bnRfbWF0cml4KSkNCiAgY291bnRfbWF0cml4IDwtIGNvdW50X21hdHJpeFshKGR1cGxpY2F0ZWQocm93bmFtZXMoY291bnRfbWF0cml4KSkgfCBkdXBsaWNhdGVkKHJvd25hbWVzKGNvdW50X21hdHJpeCksIGZyb21MYXN0ID0gVFJVRSkpLCBdDQoNCiAgdGNnYV9tYXRyaXhbW3Byb2plY3RdXSA8LSBjb3VudF9tYXRyaXgNCn0NCmBgYA0KRm9ybWF0IHRoZSBgc2FtcGxlc2AgdGFibGUgc28gdGhhdCBpdCBjYW4gYmUgZmVkIGFzIGlucHV0IHRvIERFU2VxMi4NCg0KYGBge3J9DQpmb3IgKHByb2plY3QgaW4gcHJvamVjdHMpIHsNCiAgcm93bmFtZXMoc2FtcGxlc1tbcHJvamVjdF1dKSA8LSBzYW1wbGVzW1twcm9qZWN0XV0kY2FzZXMNCiAgc2FtcGxlc1tbcHJvamVjdF1dIDwtIHNhbXBsZXNbW3Byb2plY3RdXSAlPiUNCiAgICBkcGx5cjo6c2VsZWN0KGNhc2UgPSAiY2FzZXMuc3VibWl0dGVyX2lkIiwgdHlwZSA9ICJzYW1wbGVfdHlwZSIpDQogIHNhbXBsZXNbW3Byb2plY3RdXSR0eXBlIDwtIHN0cl9yZXBsYWNlKHNhbXBsZXNbW3Byb2plY3RdXSR0eXBlLCAiU29saWQgVGlzc3VlIE5vcm1hbCIsICJub3JtYWwiKQ0KICBzYW1wbGVzW1twcm9qZWN0XV0kdHlwZSA8LSBzdHJfcmVwbGFjZShzYW1wbGVzW1twcm9qZWN0XV0kdHlwZSwgIlByaW1hcnkgVHVtb3IiLCAidHVtb3IiKQ0KfQ0KYGBgDQoNCkRFU2VxMiByZXF1aXJlcyB0aGUgcm93IG5hbWVzIG9mIGBzYW1wbGVzYCBzaG91bGQgYmUgaWRlbnRpY2FsIHRvIHRoZSBjb2x1bW4gbmFtZXMgb2YgYGNvdW50X21hdHJpeGAuDQoNCmBgYHtyLCBlY2hvID0gVFJVRSwgcmVzdWx0cz0iaGlkZSJ9DQpmb3IgKHByb2plY3QgaW4gcHJvamVjdHMpIHsNCiAgY29sbmFtZXModGNnYV9tYXRyaXhbW3Byb2plY3RdXSkgPC0gZ3N1Yih4ID0gY29sbmFtZXModGNnYV9tYXRyaXhbW3Byb2plY3RdXSksIHBhdHRlcm4gPSAiXFwuIiwgcmVwbGFjZW1lbnQgPSAiLSIpDQogIHRjZ2FfbWF0cml4W1twcm9qZWN0XV0gPC0gdGNnYV9tYXRyaXhbW3Byb2plY3RdXVssIHJvd25hbWVzKHNhbXBsZXNbW3Byb2plY3RdXSldDQoNCiAgIyBTYW5pdHkgY2hlY2sNCiAgcHJpbnQoYWxsKGNvbG5hbWVzKHRjZ2FfbWF0cml4W1twcm9qZWN0XV0pID09IHJvd25hbWVzKHNhbXBsZXNbW3Byb2plY3RdXSkpKQ0KfQ0KYGBgDQoNCiMjIElWLiBEaWZmZXJlbnRpYWwgZ2VuZSBleHByZXNzaW9uIGFuYWx5c2lzDQoNClJlZmVyZW5jZXM6IA0KDQotIE9mZmljaWFsIGRvY3VtZW50YXRpb246IGh0dHBzOi8vd3d3LmJpb2NvbmR1Y3Rvci5vcmcvcGFja2FnZXMvcmVsZWFzZS9iaW9jL3ZpZ25ldHRlcy9ERVNlcTIvaW5zdC9kb2MvREVTZXEyLmh0bWwNCi0gR29vZCBiYWxhbmNlIG9mIHRoZW9yeSBhbmQgaGFuZHMtb246IGh0dHBzOi8vaGJjdHJhaW5pbmcuZ2l0aHViLmlvL0RHRV93b3Jrc2hvcC9sZXNzb25zLzA0X0RHRV9ERVNlcTJfYW5hbHlzaXMuaHRtbA0KLSBRdWFsaXR5IGNvbnRyb2w6IGh0dHBzOi8vY3Jhbi5yLXByb2plY3Qub3JnL3dlYi9wYWNrYWdlcy9STkFzZXFRQy92aWduZXR0ZXMvaW50cm9kdWN0aW9uLmh0bWwNCg0KQ29uc3RydWN0IHRoZSBgREVTZXFEYXRhU2V0YCBvYmplY3QgZm9yIGVhY2ggY2FuY2VyIHR5cGUuDQoNCmBgYHtyfQ0KZGRzX3Jlc3VsdHMgPC0gbGlzdCgpDQoNCmZvciAocHJvamVjdCBpbiBwcm9qZWN0cykgew0KICBkZHNfcmVzdWx0c1tbcHJvamVjdF1dIDwtIERFU2VxRGF0YVNldEZyb21NYXRyaXgoDQogICAgY291bnREYXRhID0gdGNnYV9tYXRyaXhbW3Byb2plY3RdXSwNCiAgICBjb2xEYXRhID0gc2FtcGxlc1tbcHJvamVjdF1dLA0KICAgIGRlc2lnbiA9IH50eXBlDQogICkNCn0NCmBgYA0KDQoNCiMjIyBSZWd1bGF0ZWQgQ2VsbCBEZWF0aA0KDQpXZSBvYnRhaW4gdGhlIGdlbmUgc2V0cyBmcm9tIFJDRGRiOiBodHRwczovL3BtYy5uY2JpLm5sbS5uaWguZ292L2FydGljbGVzL1BNQzExMzg0OTc5Lw0KDQpBZnRlcndhcmRzLCBmaWx0ZXIgdGhlIGdlbmUgc2V0cyBpbiBvcmRlciB0byByZXRhaW4gb25seSB0aGUgZ2VuZXMgdW5pcXVlIHRvIHRoZSBSQ0QgdHlwZSBvZiBpbnRlcmVzdC4NCg0KVGhpcyBmaWx0ZXJpbmcgc3RlcCBpcyBhbHJlYWR5IGhhbmRsZWQgYnkgdGhlIFNuYWtlbWFrZSB3b3JrZmxvdy4NCg0KYGBge3J9DQpSQ0RkYiA8LSAiLi4vZGF0YS9wdWJsaWMvcmNkLWdlbmUtbGlzdC91bmlxdWUtZ2VuZXMvbmVjcm9wdG9zaXMtZmVycm9wdG9zaXMtcHlyb3B0b3Npcy8iDQpgYGANCg0KV3JpdGUgdXRpbGl0eSBmdW5jdGlvbnMgZm9yIGZpbHRlcmluZyB0aGUgZ2VuZSBzZXRzLCBwZXJmb3JtaW5nIGRpZmZlcmVudGlhbCBnZW5lIGV4cHJlc3Npb24gYW5hbHlzaXMsIGFuZCBwbG90dGluZyB0aGUgcmVzdWx0cy4NCg0KYGBge3J9DQpmaWx0ZXJfZ2VuZV9zZXRfYW5kX3BlcmZvcm1fZGdlYSA8LSBmdW5jdGlvbihnZW5lcykgew0KICB0Y2dhX3JjZCA8LSBsaXN0KCkNCg0KICBmb3IgKHByb2plY3QgaW4gcHJvamVjdHMpIHsNCiAgICByb3duYW1lcyhnZW5lcykgPC0gZ2VuZXMkZ2VuZV9pZA0KICAgIHRjZ2FfcmNkW1twcm9qZWN0XV0gPC0gdGNnYV9tYXRyaXhbW3Byb2plY3RdXVtyb3duYW1lcyh0Y2dhX21hdHJpeFtbcHJvamVjdF1dKSAlaW4lIGdlbmVzJGdlbmVfaWQsIF0NCiAgICB0Y2dhX3JjZFtbcHJvamVjdF1dIDwtIHRjZ2FfcmNkW1twcm9qZWN0XV1bLCByb3duYW1lcyhzYW1wbGVzW1twcm9qZWN0XV0pXQ0KICB9DQoNCiAgZGRzX3JjZCA8LSBsaXN0KCkNCiAgcmVzX3JjZCA8LSBsaXN0KCkNCg0KICBmb3IgKHByb2plY3QgaW4gcHJvamVjdHMpIHsNCiAgICBwcmludChwcm9qZWN0KQ0KICAgIHByaW50KCI9PT09PT09PT09PT09IikNCiAgICBkZHMgPC0gREVTZXFEYXRhU2V0RnJvbU1hdHJpeCgNCiAgICAgIGNvdW50RGF0YSA9IHRjZ2FfcmNkW1twcm9qZWN0XV0sDQogICAgICBjb2xEYXRhID0gc2FtcGxlc1tbcHJvamVjdF1dLA0KICAgICAgZGVzaWduID0gfnR5cGUNCiAgICApDQogICAgZGRzIDwtIGZpbHRlcl9nZW5lcyhkZHMsIG1pbl9jb3VudCA9IDEwKQ0KICAgIGRkcyR0eXBlIDwtIHJlbGV2ZWwoZGRzJHR5cGUsIHJlZiA9ICJub3JtYWwiKQ0KICAgIGRkc19yY2RbW3Byb2plY3RdXSA8LSBERVNlcShkZHMpDQogICAgcmVzX3JjZFtbcHJvamVjdF1dIDwtIHJlc3VsdHMoZGRzX3JjZFtbcHJvamVjdF1dKQ0KICB9DQoNCiAgZGVzZXEuYmJsLmRhdGEgPC0gbGlzdCgpDQoNCiAgZm9yIChwcm9qZWN0IGluIHByb2plY3RzKSB7DQogICAgZGVzZXEucmVzdWx0cyA8LSByZXNfcmNkW1twcm9qZWN0XV0NCiAgICBkZXNlcS5iYmwuZGF0YVtbcHJvamVjdF1dIDwtIGRhdGEuZnJhbWUoDQogICAgICByb3cubmFtZXMgPSByb3duYW1lcyhkZXNlcS5yZXN1bHRzKSwNCiAgICAgIGJhc2VNZWFuID0gZGVzZXEucmVzdWx0cyRiYXNlTWVhbiwNCiAgICAgIGxvZzJGb2xkQ2hhbmdlID0gZGVzZXEucmVzdWx0cyRsb2cyRm9sZENoYW5nZSwNCiAgICAgIGxmY1NFID0gZGVzZXEucmVzdWx0cyRsZmNTRSwNCiAgICAgIHN0YXQgPSBkZXNlcS5yZXN1bHRzJHN0YXQsDQogICAgICBwdmFsdWUgPSBkZXNlcS5yZXN1bHRzJHB2YWx1ZSwNCiAgICAgIHBhZGogPSBkZXNlcS5yZXN1bHRzJHBhZGosDQogICAgICBjYW5jZXJfdHlwZSA9IHByb2plY3QsDQogICAgICBnZW5lX3N5bWJvbCA9IGdlbmVzW3Jvd25hbWVzKGRlc2VxLnJlc3VsdHMpLCAiZ2VuZSJdDQogICAgKQ0KICB9DQoNCiAgZGVzZXEuYmJsLmRhdGEuY29tYmluZWQgPC0gYmluZF9yb3dzKGRlc2VxLmJibC5kYXRhKQ0KICBkZXNlcS5iYmwuZGF0YS5jb21iaW5lZCA8LSBkcGx5cjo6ZmlsdGVyKGRlc2VxLmJibC5kYXRhLmNvbWJpbmVkLCBhYnMobG9nMkZvbGRDaGFuZ2UpID49IDEuNSAmIHBhZGogPCAwLjA1KQ0KDQogIHJldHVybihkZXNlcS5iYmwuZGF0YS5jb21iaW5lZCkNCn0NCmBgYA0KDQpgYGB7cn0NCnBsb3RfZGdlYSA8LSBmdW5jdGlvbihkZXNlcS5iYmwuZGF0YS5jb21iaW5lZCkgew0KICBzaXplcyA8LSBjKCI8MTBeLTE1IiA9IDQsICIxMF4tMTAiID0gMywgIjEwXi01IiA9IDIsICIwLjA1IiA9IDEpDQoNCiAgZGVzZXEuYmJsLmRhdGEuY29tYmluZWQgPC0gZGVzZXEuYmJsLmRhdGEuY29tYmluZWQgJT4lDQogICAgbXV0YXRlKGZkcl9jYXRlZ29yeSA9IGN1dChwYWRqLA0KICAgICAgYnJlYWtzID0gYygtSW5mLCAxZS0xNSwgMWUtMTAsIDFlLTUsIDAuMDUpLA0KICAgICAgbGFiZWxzID0gYygiPDEwXi0xNSIsICIxMF4tMTAiLCAiMTBeLTUiLCAiMC4wNSIpLA0KICAgICAgcmlnaHQgPSBGQUxTRQ0KICAgICkpDQoNCiAgdG9wX2dlbmVzIDwtIGRlc2VxLmJibC5kYXRhLmNvbWJpbmVkICU+JQ0KICAgIGdyb3VwX2J5KGNhbmNlcl90eXBlKSAlPiUNCiAgICBtdXRhdGUocmFuayA9IHJhbmsoLWFicyhsb2cyRm9sZENoYW5nZSkpKSAlPiUNCiAgICBkcGx5cjo6ZmlsdGVyKHJhbmsgPD0gMTApICU+JQ0KICAgIHVuZ3JvdXAoKQ0KDQogIGdncGxvdCh0b3BfZ2VuZXMsIGFlcyh5ID0gY2FuY2VyX3R5cGUsIHggPSBnZW5lX3N5bWJvbCwgc2l6ZSA9IGZkcl9jYXRlZ29yeSwgZmlsbCA9IGxvZzJGb2xkQ2hhbmdlKSkgKw0KICAgIGdlb21fcG9pbnQoYWxwaGEgPSAwLjUsIHNoYXBlID0gMjEsIGNvbG9yID0gImJsYWNrIikgKw0KICAgIHNjYWxlX3NpemVfbWFudWFsKHZhbHVlcyA9IHNpemVzKSArDQogICAgc2NhbGVfZmlsbF9ncmFkaWVudDIobG93ID0gImJsdWUiLCBtaWQgPSAid2hpdGUiLCBoaWdoID0gInJlZCIsIGxpbWl0cyA9IGMobWluKGRlc2VxLmJibC5kYXRhLmNvbWJpbmVkJGxvZzJGb2xkQ2hhbmdlKSwgbWF4KGRlc2VxLmJibC5kYXRhLmNvbWJpbmVkJGxvZzJGb2xkQ2hhbmdlKSkpICsNCiAgICB0aGVtZV9taW5pbWFsKCkgKw0KICAgIHRoZW1lKA0KICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDksIGFuZ2xlID0gOTAsIGhqdXN0ID0gMSkNCiAgICApICsNCiAgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIikgKw0KICAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iKSArDQogICAgbGFicyhzaXplID0gIkFkanVzdGVkIHAtdmFsdWUiLCBmaWxsID0gImxvZzIgRkMiLCB5ID0gIkNhbmNlciB0eXBlIiwgeCA9ICJHZW5lIikNCn0NCmBgYA0KDQojIyMjIDEuIE5lY3JvcHRvc2lzDQoNCkZldGNoIHRoZSBnZW5lIHNldCBvZiBpbnRlcmVzdC4NCg0KYGBge3J9DQpnZW5lcyA8LSByZWFkLmNzdihwYXN0ZTAoUkNEZGIsICJOZWNyb3B0b3Npcy5jc3YiKSkNCnByaW50KGdlbmVzKQ0KZ2VuZXMkZ2VuZV9pZCA8LSBjbGVhbmlkKGdlbmVzJGdlbmVfaWQpDQpnZW5lcyA8LSBkaXN0aW5jdChnZW5lcywgZ2VuZV9pZCwgLmtlZXBfYWxsID0gVFJVRSkNCmdlbmVzIDwtIHN1YnNldChnZW5lcywgZ2VuZV9pZCAhPSAiIikNCmdlbmVzDQpgYGANCkZpbHRlciB0aGUgZ2VuZXMgdG8gaW5jbHVkZSBvbmx5IHRob3NlIGluIHRoZSBnZW5lIHNldCBvZiBpbnRlcmVzdCwgYW5kIHRoZW4gcGVyZm9ybSBkaWZmZXJlbnRpYWwgZ2VuZSBleHByZXNzaW9uIGFuYWx5c2lzLg0KDQpgYGB7cn0NCmRlc2VxLmJibC5kYXRhLmNvbWJpbmVkIDwtIGZpbHRlcl9nZW5lX3NldF9hbmRfcGVyZm9ybV9kZ2VhKGdlbmVzKQ0KZGVzZXEuYmJsLmRhdGEuY29tYmluZWQNCmBgYA0KDQpQbG90IHRoZSByZXN1bHRzLg0KDQpgYGB7ciwgZmlnLndpZHRoID0gMTUsIGZpZy5oZWlnaHQ9NX0NCnBsb3RfZGdlYShkZXNlcS5iYmwuZGF0YS5jb21iaW5lZCkNCmBgYA0KDQojIyMjIDIuIEZlcnJvcHRvc2lzDQoNCkZldGNoIHRoZSBnZW5lIHNldCBvZiBpbnRlcmVzdC4NCg0KYGBge3J9DQpnZW5lcyA8LSByZWFkLmNzdihwYXN0ZTAoUkNEZGIsICJGZXJyb3B0b3Npcy5jc3YiKSkNCmdlbmVzJGdlbmVfaWQgPC0gY2xlYW5pZChnZW5lcyRnZW5lX2lkKQ0KZ2VuZXMgPC0gZGlzdGluY3QoZ2VuZXMsIGdlbmVfaWQsIC5rZWVwX2FsbCA9IFRSVUUpDQpnZW5lcyA8LSBzdWJzZXQoZ2VuZXMsIGdlbmVfaWQgIT0gIiIpDQpnZW5lcw0KYGBgDQoNCkZpbHRlciB0aGUgZ2VuZXMgdG8gaW5jbHVkZSBvbmx5IHRob3NlIGluIHRoZSBnZW5lIHNldCBvZiBpbnRlcmVzdCwgYW5kIHRoZW4gcGVyZm9ybSBkaWZmZXJlbnRpYWwgZ2VuZSBleHByZXNzaW9uIGFuYWx5c2lzLg0KDQpgYGB7cn0NCmRlc2VxLmJibC5kYXRhLmNvbWJpbmVkIDwtIGZpbHRlcl9nZW5lX3NldF9hbmRfcGVyZm9ybV9kZ2VhKGdlbmVzKQ0KZGVzZXEuYmJsLmRhdGEuY29tYmluZWQNCmBgYA0KDQpQbG90IHRoZSByZXN1bHRzLg0KDQpgYGB7ciwgZmlnLndpZHRoID0gMTUsIGZpZy5oZWlnaHQ9NX0NCnBsb3RfZGdlYShkZXNlcS5iYmwuZGF0YS5jb21iaW5lZCkNCmBgYA0KDQojIyMjIDMuIFB5cm9wdG9zaXMNCg0KRmV0Y2ggdGhlIGdlbmUgc2V0IG9mIGludGVyZXN0Lg0KDQpgYGB7cn0NCmdlbmVzIDwtIHJlYWQuY3N2KHBhc3RlMChSQ0RkYiwgIlB5cm9wdG9zaXMuY3N2IikpDQpnZW5lcyRnZW5lX2lkIDwtIGNsZWFuaWQoZ2VuZXMkZ2VuZV9pZCkNCmdlbmVzIDwtIGRpc3RpbmN0KGdlbmVzLCBnZW5lX2lkLCAua2VlcF9hbGwgPSBUUlVFKQ0KZ2VuZXMgPC0gc3Vic2V0KGdlbmVzLCBnZW5lX2lkICE9ICIiKQ0KZ2VuZXMNCmBgYA0KDQpGaWx0ZXIgdGhlIGdlbmVzIHRvIGluY2x1ZGUgb25seSB0aG9zZSBpbiB0aGUgZ2VuZSBzZXQgb2YgaW50ZXJlc3QsIGFuZCB0aGVuIHBlcmZvcm0gZGlmZmVyZW50aWFsIGdlbmUgZXhwcmVzc2lvbiBhbmFseXNpcy4NCg0KYGBge3J9DQpkZXNlcS5iYmwuZGF0YS5jb21iaW5lZCA8LSBmaWx0ZXJfZ2VuZV9zZXRfYW5kX3BlcmZvcm1fZGdlYShnZW5lcykNCmRlc2VxLmJibC5kYXRhLmNvbWJpbmVkDQpgYGANCg0KUGxvdCB0aGUgcmVzdWx0cy4NCg0KYGBge3IsIGZpZy53aWR0aCA9IDE1LCBmaWcuaGVpZ2h0PTV9DQpwbG90X2RnZWEoZGVzZXEuYmJsLmRhdGEuY29tYmluZWQpDQpgYGA=